package _1_6_lambda;

import com.google.common.base.CaseFormat;
import org.junit.Test;

import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

/**
 * Created by bpzj on 2018/4/20.
 */
public class LambdaTest {
    public static byte easeMobId = 1;

    @Test
    public void filter() {
        List<String> old = new ArrayList<>();
        old.add("1");
        old.add("2");
        old.add("");

        List<String> afterFilter = old.stream().filter(i -> i.equals("1")).collect(Collectors.toList());
        System.out.println(afterFilter);
        System.out.println(old);
    }

    @Test
    public void iterableTest() {

        //    ->  符号
        //  (x, y) -> x + y ;        多个参数
        //  () -> { code } ;

        List<String> languages = Arrays.asList("java","scala","python");
        languages.forEach(x -> System.out.println(x));
        // 用 method reference 更简洁，推荐使用:
        languages.forEach(System.out::println);


        // Stream 类，内部迭代
        //  1. get Stream
        //          1.1  Collection 接口的 所有实现类 都有 stream() 方法
        //          1.2  Stream.of()
        //  2. 惰性求值 Stream 继续转为 Stream
        //          2.1  map, filter, flatMap, max, min
        //  3. 及早求值 得到结果
        //          3.1  collect

        // String[] 转为 int[]
        String arrayStr = "1,2,3";
        int[] integers = Arrays.stream(arrayStr.split(",")).mapToInt(Integer::parseInt).toArray();
        int[] ints = Pattern.compile(",").splitAsStream(arrayStr).mapToInt(Integer::parseInt).toArray();
        Integer max = Arrays.stream(integers).max().orElseThrow(IllegalArgumentException::new);
        System.out.println(max);
    }

    /**
     * List 每个元素 进行 一定的转化
     */

    //      1. List<String> 每个元素 _下划线变量名转为 驼峰命名
    @Test
    public void underScoreCaseToCamelcase() {
        List<String> underScore = Arrays.asList("wang_li_wei", "zhai_han", "wu_yue", "zhang_si_yu");

        List<String> camelCase = underScore
            .stream()
            .map(item -> CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL,item))
            .collect(Collectors.toList());

        System.out.println(camelCase);
    }

    /**
     * 各种对象 和 Map 直接转换
     */
    //      1. 从 java bean 中取两个属性，一个作 key，一个作 value，转为 map
    @Test
    public void beanPropertyToMap() {
        List<Bean> beanList = new ArrayList<>();
        Bean bean1 = new Bean("ym", "best");
        Bean bean2 = new Bean("wy", "beauty");

        beanList.add(bean1);
        beanList.add(bean2);

        // list组装完成 开始转换 不推荐
        Map<String, Object> objectMap = new HashMap<>();
        beanList.forEach(item -> objectMap.put(item.getKey(),item.getValue()));
        System.out.println(objectMap);

        // 另一种方法，推荐
        Map<String, Object> map = beanList.stream().collect(Collectors.toMap(Bean::getKey, Bean::getValue));

        System.out.println(map);

    }



    /**
     * Map<String, Object> 转为  Map<String, String>
     */
    @Test
    public void mapTrans() {
        // this branch is crested from bpzj branch
    }

}
